package com.jlf.core.engine.domain;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.jlf.core.annotation.Domain;
import com.jlf.core.domain._SimpleDO;
import com.jlf.core.engine.constant.SchemaConstant;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;

/**
 * 领域定义的字段定义模型领域
 *
 * @author wujr
 * 2023/7/5
 * @version 1.0
 * 【变更历史】
 * [wujr 2023/7/5 1.0 新增]
 */
@Getter
@Setter
@Domain(code = "schemaField", name = "领域字段", table = "e_jlf_schema_field")
public class SchemaFieldDO extends _SimpleDO<SchemaFieldDO> {
    /**
     * 数据表的编码 {@link SchemaDomainDO#getDomainCode()}
     */
    private String domainCode;
    /**
     * 数据类型
     * 在生成的领域模型中的字段数据类型 {@link SchemaConstant.Java.Type}
     */
    private Integer classDataType;
    /**
     * 字段编码
     * 用于生成的模型的属性
     */
    private String classFieldCode;
    /**
     * 字段显示名称
     * 用于展示
     */
    private String displayName;
    /**
     * 数据库字段编码
     * 用于生成的数据库的字段
     * 空表示使用code自动生成
     */
    private String jdbcFieldCode;
    /**
     * 在数据库中数据类型 {@link SchemaConstant.Jdbc.Type}
     */
    private Integer jdbcFieldType;
    /**
     * 数据长度
     * 用于数据库中建表定义数据长度
     */
    private Integer jdbcFieldLength;
    /**
     * 是否允许为空
     */
    private Boolean jdbcNullable;
    /**
     * 默认值
     */
    private String defaultValue;

    public SchemaFieldDO(){}
    public SchemaFieldDO(Integer classDataType, String classFieldCode,
                         Integer jdbcFieldType, String jdbcFieldCode){
        this(classDataType, classFieldCode, jdbcFieldType, jdbcFieldCode, 0, null);
    }
    public SchemaFieldDO(Integer classDataType, String classFieldCode,
                         Integer jdbcFieldType, String jdbcFieldCode, Integer jdbcFieldLength,
                         String defaultValue){
        this.classDataType = classDataType;
        this.classFieldCode = classFieldCode;
        this.jdbcFieldType = jdbcFieldType;
        this.jdbcFieldCode = jdbcFieldCode;
        this.jdbcFieldLength = jdbcFieldLength;
        this.defaultValue = defaultValue;
    }

    @JsonIgnore
    @JsonIgnoreProperties
    public boolean isNullable(){
        return Boolean.TRUE.equals(jdbcNullable);
    }

    @JsonIgnore
    @JsonIgnoreProperties
    public boolean hasDefaultValue() {
        return !StringUtils.isBlank(this.defaultValue);
    }

    @JsonIgnore
    @JsonIgnoreProperties
    public boolean isString(){
        return SchemaConstant.Jdbc.Type.STRING.equals(this.jdbcFieldType);
    }
}
